import java.util.Arrays;
public class MyArrayList {
        public int[] elem;
        public int usedSize;//0   记录大小
        //默认容量
        private static final int DEFAULT_SIZE = 10;
        public MyArrayList() {
            this.elem = new int[DEFAULT_SIZE];
        }
        /**
         * 打印顺序表:
         *   根据usedSize判断即可
         */
    public void display() {
            if(elem == null ) {
                return;
            }
            int ret = 1;
            while(ret <= this.usedSize) {
                System.out.println(elem[ret - 1] + " ");
                ret++;
            }
         }

        // 新增元素,默认在数组最后新增   (需要进行判断是否需要进行扩容)
        public void add(int data) {
            if(isFull()) {
                //如果满了就进行扩容处理
                resize();
            }
            this.elem[usedSize] = data;
            this.usedSize++;
        }
        //扩容
        public void resize() {
            this.elem = Arrays.copyOf(this.elem,this.elem.length * 2);
        }
        /**
         * 判断当前的顺序表是不是满的！
         * @return true:满   false代表空
         */
        public boolean isFull() {
            if(usedSize < DEFAULT_SIZE) {
                return false;
            }
            return true;
        }

        //检查pos的位置是否合法
        private void checkPosInAdd(int pos) {
            if(pos < 0 || pos > usedSize) {
                throw new IndexOutOfException("pos插入的位置不合法，请检查");
            }
        }

        // 在 pos 位置新增元素
        public void add(int pos, int data) {
            checkPosInAdd(pos);
                //说明插入点在最后一位
                if(elem[pos] == 0) {
                    add(data);
                }
                else { //说明是在中间进行插入值，元素要进行往后移动
                    for (int i = this.usedSize; i > pos; i--) {
                        this.elem[i] = this.elem[i - 1];
                    }
                    this.elem[pos] = data;
                    this.usedSize++;
                }
        }

        // 判定是否包含某个元素
        public boolean contains(int toFind) {
            for (int i = 0; i < usedSize; i++) {
                if(elem[i] == toFind) {
                    return true;
                }
            }
            return false;
        }
        // 查找某个元素对应的位置
        public int indexOf(int toFind) {
            for (int i = 0; i < usedSize; i++) {
                if(elem[i] == toFind) {
                    return i;
                }
            }
            return -1;
        }

        // 获取 pos 位置的元素
        public int get(int pos) {
            checkPosInAdd(pos);
            return this.elem[pos];
        }
        //判断是否为空
        private boolean isEmpty() {

            return this.usedSize == 0;
        }
        // 给 pos 位置的元素设为【更新为】 value
        public void set(int pos, int value) {
            checkPosInAdd(pos); //检查pos的位置是否合法
            this.elem[pos] = value;
        }

        /**
         * 删除第一次出现的关键字key
         * @param key
         */
        public void remove(int key) {
            //先判断是否包含这个值，返回下标
            int index = indexOf(key);
            if(index == -1) {
                throw new IndexOutOfException("没有要删除的值，请检查！"); //说明没有要删除的值
            }
            //走到这说明有这个值,
            for (int i = index; i < this.usedSize - 1; i++) {
                this.elem[i] = this.elem[i + 1];
            }
            this.usedSize--;
            //把最后一个值给置零
            this.elem[this.usedSize] = 0;
        }

        // 获取顺序表长度
        public int size() {
            return  this.usedSize;
        }

        // 清空顺序表
        public void clear() {
            /**for (int i = 0; i < this.usedSize; i++) {
                this.elem[i] = 0;
            } */
            this.usedSize = 0;
        }
}

